#pragma once


#include"Common.h"


// page cache本质上按页数映射的哈希桶
// 为保证全局只有一个page cache, 将其设置为单例模式
class PageCache
{
public:
    // 提供一个全局访问点
    static PageCache* GetInstance()
    {
        return &_sInst;
    }

    // 获取K页的span
    Span* NewSpan(size_t k);

    // 建立内存对象到span的映射
    Span* MapObjectToSpan(void* obj);

    // 释放空闲的span到page cache, 并尝试做前后页span的合并
    void ReleaseSpanToPageCache(Span* span);

private:
    PageCache()
    {}

    PageCache(const PageCache&) = delete;

    static PageCache _sInst;

private:
    SpanList _spanLists[NPAGES];

private:
    std::unordered_map<PAGE_ID, Span*> _idSpanMap;

public:
    std::mutex _pageMtx;
};